package com.keyou.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * @Author: klq
 * @Date: 2023/1/10 10:53
 * @Description:
 */

/**
 * RestControllerAdvice本质上是个Component，用于定义@ExceptionHandler，@InitBinder和@ModelAttribute方法，适用于所有使用@RequestMapping方法。
 * 注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 全局异常处理：
     * 应用到所有@RequestMapping注解的方法，在其抛出Exception异常时执行
     * 定义全局异常处理，value属性可以拦截指定的异常，这里拦截SQLIntegrityConstraintViolationException
     *
     * @param exception
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public ResultInfo<String> exceptionHandler(SQLIntegrityConstraintViolationException exception) {
        //控制台打印完整异常信息
        exception.printStackTrace();
        //log.error(exception.getMessage());

        //如果包含Duplicate entry，则说明有条目重复
        if (exception.getMessage().contains("Duplicate entry")) {
            //对字符串切片
            String[] split = exception.getMessage().split(" ");
            //字符串格式是固定的，所以这个位置必然是username
            String username = split[2];
            //拼串作为错误信息返回
            return ResultInfo.error("用户名" + username + "已存在");
        }
        //如果是别的错误那我也没招儿了
        return ResultInfo.systemError();
    }

    @ExceptionHandler(CustomException.class)
    public ResultInfo<String> exceptionHandler(CustomException exception) {
        log.error(exception.getMessage());
        return ResultInfo.error(exception.getMessage());
    }

}